Convert BST to greater tree¶
Time: O(N); Space: O(H); easy
Given a Binary Search Tree (BST), convert it to a Greater Tree such that:
every key of the original BST is changed to the original key plus sum of all keys greater than the original key in BST.
Example 1:
5
/ \
2 13
Input: root = {TreeNode} [5,2,13]
18
/ \
20 13
Output: {TreeNode} [18,20,13]
Example 2:
5
/ \
3 15
Input: root = {TreeNode} [5,3,15]
20
/ \
23 15
Output: {TreeNode} [20,23,15]
Notes:
This question is the same as https://leetcode.com/problems/binary-search-tree-to-greater-sum-tree/
[5]:
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
Auxiliary Tools¶
[6]:
from graphviz import Graph
class TreeTasks(object):
def visualize_tree(self, tree):
def add_nodes_edges(tree, dot=None):
# Create Graph (not Digraph) object
if dot is None:
dot = Graph()
dot.node(name=str(tree), label=str(tree.val))
# Add nodes
if tree.left:
dot.node(name=str(tree.left), label="."+str(tree.left.val))
dot.edge(str(tree), str(tree.left))
dot = add_nodes_edges(tree.left, dot=dot)
if tree.right:
dot.node(name=str(tree.right), label=str(tree.right.val)+".")
dot.edge(str(tree), str(tree.right))
dot = add_nodes_edges(tree.right, dot=dot)
return dot
# Add nodes recursively and create a list of edges
dot = add_nodes_edges(tree)
# Visualize the graph
display(dot)
return dot
1. Recursion¶
[7]:
class Solution1(object):
"""
Time: O(N)
Space: O(H)
"""
def convertBST(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
def convertBSTHelper(root, cur_sum):
if not root:
return cur_sum
if root.right:
cur_sum = convertBSTHelper(root.right, cur_sum)
cur_sum += root.val
root.val = cur_sum
if root.left:
cur_sum = convertBSTHelper(root.left, cur_sum)
return cur_sum
convertBSTHelper(root, 0)
return root
[8]:
s = Solution1()
root = TreeNode(5)
root.left, root.right = TreeNode(2), TreeNode(13)
tree = s.convertBST(root)
t = TreeTasks()
dot = t.visualize_tree(tree)
[9]:
root = TreeNode(5)
root.left, root.right = TreeNode(3), TreeNode(15)
tree = s.convertBST(root)
t = TreeTasks()
dot = t.visualize_tree(tree)
See also:¶
https://leetcode.com/problems/convert-bst-to-greater-tree
https://www.lintcode.com/problem/convert-bst-to-greater-tree/description
Related problems:¶
https://leetcode.com/problems/binary-search-tree-to-greater-sum-tree/